package top.lshaci.learning.jvm.string;

import java.util.HashSet;
import java.util.Set;

/**
 * StringOOMTest
 *
 * @author lshaci
 * @date 2020/7/16 11:32
 * @since 1.0.0
 */
public class StringOOMTest {

    /**
     * JDK6: -XX:PermSize=6m -XX:MaxPermSize=6m -Xms6m -Xmx6m
     *      Exception in thread "main" java.lang.OutOfMemoryError:PermGen space
     *      永久代内存溢出，而不是堆内存溢出
     *      说明字符串常量池在永久代中
     *
     * JDK8: -XX:MetaspaceSize=6m -XX:MaxMetaspaceSize=10m -Xms6m -Xmx6m
     *      Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     *      堆内存溢出，而不是元空间内存溢出
     *      说明字符串常量池在堆中
     */
    public static void main(String[] args) {
        // 使用set保持着常量池引用，避免full gc回收常量池行为
        Set<String> set = new HashSet<>();
        // 在short可以取值的范围内足以让6MB的PermSize或者Heap产生OOM
        short i = 0;
        while (true) {
            set.add(String.valueOf(i++).intern());
        }
    }
}
